package com.wanghaixin.log;

import com.alibaba.fastjson.JSON;
import com.wanghaixin.utils.HttpContextUtils;
import com.wanghaixin.utils.IPUtils;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Date;


/**
 * @Auther: 王海新
 * @Date: 2020/10/28 17:02
 * @Description: 日志的切面类
 */
//标识为切面类
@Aspect
@Component
public class MyLogAdvice {

    //调用apache下的logger 公共日志类
    private Logger logger = Logger.getLogger(MyLogAdvice.class);
    //切入到使用了这个自定义注解的
    @Pointcut("@annotation(com.wanghaixin.log.MyLog)")
    public void myPointcut(){

    }

    //开发通知
    @AfterReturning(pointcut = "myPointcut()") //引入切入点
    public void myafterRet(JoinPoint joinPoint){
        //通过反射的方式拿到这个接口的实现类
        MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
        //然后拿到方法
        Method method = methodSignature.getMethod();
        //通过这个方法拿到自定义的注解
        MyLog annotation = method.getAnnotation(MyLog.class);
        //如果这个注解不等于空，我们就拿到用户的操作
        String operation = null;
        if (annotation != null) {
            operation = annotation.value();
        }
        //利用工具类拿到用户的ip
        String ip = IPUtils.getIpAddr(HttpContextUtils.getHttpServletRequest());
        //拿到参数
        Object[] args = joinPoint.getArgs();
        //将参数转化为json格式
        String toJSONString = JSON.toJSONString(args);

        //拿到目标类的名称，再拿到目标类中方法的名称
        String methodName = joinPoint.getTarget().getClass().getName() + "." + method.getName();
        //把内容写入 时间 操作的内容 操作的IP 操作的参数 类和方法的名称
        logger.info(new Date() + "|" + operation + "|" + ip + "|"
                + "|" + toJSONString + "|" + methodName);
    }
}
